function abbreviate_ipv6(ip) {
  if (ip.indexOf('::') === -1) {
    for (let i = 0; i < 3; i++) {
      ip = ip.replace(/^0+/, '').replace(/\:0/g, ':')
    }
    let sixteens = ip.split(':'),
      max = 0,
      current = 0,
      replace = ''
    sixteens.forEach((item, i) => {
      if (item === '') {
        item = '0'
        sixteens[i] = '0'
      }
      if (!/\D/.test(item)) {
        sixteens[i] = parseInt(sixteens[i], 10)
      }
      if (item === '0' && i !== 0) {
        current += 1
      } else {
        max = Math.max(current, max)
        current = 0
      }
    })
    for (let i = 0; i < max; i++) {
      replace += ':0'
    }
    let ipv6 = sixteens.join(':')
    if (replace === '') {
      return ipv6
    } else {
      return ipv6.replace(replace, ':')
    }
  } else {
    return ip
  }
}

// 密码中不要出现3位及以上连续的字母、数字或特殊字符
function isContinuousChar(str) {
  str = str.toLowerCase()
  var arr = str.split('')
  var flag = true
  for (var i = 1; i < arr.length - 1; i++) {
    var firstIndex = arr[i - 1].charCodeAt()
    var secondIndex = arr[i].charCodeAt()
    var thirdIndex = arr[i + 1].charCodeAt()
    if (thirdIndex - secondIndex == 1 && secondIndex - firstIndex == 1) {
      flag = false
    }
  }
  return flag
}

// 密码中不要出现3位及以上键盘排序密码
function isKeyBoardContinuousChar(str) {
  str = str.toLowerCase()
  var c1 = [
    ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+'],
    ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '{', '}', '|'],
    ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ':', '"'],
    ['z', 'x', 'c', 'v', 'b', 'n', 'm', '<', '>', '?']
  ]
  var c2 = [
    ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '='],
    ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\'],
    ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', "'"],
    ['z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/']
  ]
  str = str.split('')
  //获取坐标位置
  var y = []
  var x = []
  for (var c = 0; c < str.length; c++) {
    y[c] = 0 //当做~`键处理
    x[c] = -1
    for (var i = 0; i < c1.length; i++) {
      for (var j = 0; j < c1[i].length; j++) {
        if (str[c] == c1[i][j]) {
          y[c] = i
          x[c] = j
        }
      }
    }
    if (x[c] != -1) continue
    for (var i = 0; i < c2.length; i++) {
      for (var j = 0; j < c2[i].length; j++) {
        if (str[c] == c2[i][j]) {
          y[c] = i
          x[c] = j
        }
      }
    }
  }
  //匹配坐标连线
  for (var c = 1; c < str.length - 1; c++) {
    if (y[c - 1] == y[c] && y[c] == y[c + 1]) {
      if (
        (x[c - 1] + 1 == x[c] && x[c] + 1 == x[c + 1]) ||
        (x[c + 1] + 1 == x[c] && x[c] + 1 == x[c - 1])
      ) {
        return true
      }
    } else if (x[c - 1] == x[c] && x[c] == x[c + 1]) {
      if (
        (y[c - 1] + 1 == y[c] && y[c] + 1 == y[c + 1]) ||
        (y[c + 1] + 1 == y[c] && y[c] + 1 == y[c - 1])
      ) {
        return true
      }
    }
  }
  return false
}

// 密码中不要出现公司名
function isCompanyNameChar(str) {
  let names = ['cmss', 'chinamobile']
  for (let name of names) {
    if (str.toUpperCase().includes(name.toUpperCase())) {
      return true
    }
  }
  return false
}

// 密码复杂性校验
function passwordVerify(value) {
  // 密码长度为8 - 32个字符，且至少一个大写字母、一个小写字母、一个数字、一个特殊字符
  let pattern1 = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#￥%^&*])[A-Za-z\d!@#￥%^&*]{8,32}$/
  // 密码中不要出现3位及以上重复的字母、数字或特殊字符
  let pattern2 = /([A-Za-z\d!@#￥%^&*])*([A-Za-z\d!@#￥%^&*])\2{2}([A-Za-z\d!@#￥%^&*])*/gi
  // 特殊字符应只包含!@#￥%^&*
  let pattern3 = /^[A-Za-z\d!@#￥%^&*]+$/
  // console.log(pattern3.test(value))
  // 密码中不要出现电话号码
  let tel = /0\d{2,3}-?\d{7,8}/
  let phone = /(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}/
  // 密码中不要出现日期
  let date = /[1-9]\d{3}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])/

  if (!value) {
    return '请输入密码'
  } else {
    if (value.toString().length < 8 || value.toString().length > 32) {
      return '密码长度为8 - 32个字符'
    } else if (!pattern3.test(value)) {
      return '特殊字符应只包含!@#￥%^&*'
    } else if (!pattern1.test(value)) {
      return '至少一个大写字母、一个小写字母、一个数字、一个特殊字符'
    } else if (pattern2.test(value)) {
      return '密码中不要出现3位及以上重复的字母、数字或特殊字符'
    } else if (!isContinuousChar(value)) {
      return '密码中不要出现3位及以上连续的字母、数字或特殊字符'
    } else if (isKeyBoardContinuousChar(value)) {
      return '密码中不要出现3位及以上键盘排序密码'
    } else if (date.test(value)) {
      return '密码中不要出现日期'
    } else if (isCompanyNameChar(value)) {
      return '密码中不要出现公司名'
    } else {
      return
    }
  }
}

function checkDuplicationNormal(arr) {
  return arr.some((val, idx) => {
    return arr.includes(val, idx + 1)
  })
}

export default {
  passwordVerify,
  //校验ip
  ipValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入IP'))
    } else {
      let ipReg = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
      let ipv6Reg = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
      if (ipReg.test(value) || ipv6Reg.test(value)) {
        return callback()
      }
      return callback(new Error('请输入正确的IP'))
    }
  },
  //ipv6
  changeIpShow(value) {
    let ipReg = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
    let ipv6Reg = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
    let pattIp = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\:([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5])$/
    if (ipReg.test(value) || pattIp.test(value)) {
      return value
    } else if (ipv6Reg.test(value)) {
      return abbreviate_ipv6(value)
    } else {
      return '-'
    }
  },
  changeIpPortShow(value) {
    let index = value.lastIndexOf(':')
    let ip = value.slice(0, index)
    let port = value.slice(index + 1)
    if (!/^[0-9]\d*$/.test(port) || Number(port) < 1 || Number(port) > 65535) {
      port = '-'
    }
    return this.changeIpShow(ip) + ':' + port
  },
  //安全策略
  policyNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入策略名称'))
    } else {
      if (/^[0-9a-zA-Z_]{5,22}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('5-22位数字、字母、下划线!'))
      }
    }
  },
  // ruleNameValidator(rule, value, callback) {
  //   if (!value) {
  //     return callback(new Error('请输入规则名称'))
  //   } else {
  //     if (/^[0-9a-zA-Z_]{5,22}$/.test(value)) {
  //       return callback()
  //     } else {
  //       return callback(new Error('5-22位数字、字母、下划线!'))
  //     }
  //   }
  // },
  rulePathValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入保护目录'))
    } else {
      if (!/^(?!.*[<>|])/g.test(value)) {
        return callback(new Error('请输入除"<"">""|"字符外的其他内容！'))
      } else if (value.length > 500) {
        return callback(new Error('请输入不超过500个字符！'))
      } else {
        return callback()
      }
    }
  },
  descriptionValidator(rule, value, callback) {
    if (!value) {
      return callback()
    } else {
      if (/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(value) && value.length <= 200) {
        return callback()
      } else {
        return callback(new Error('200个字符数以内，只能为数字、字母、下划线、中文!'))
      }
    }
  },
  //新建告警，名称
  alarmNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('告警名称不能为空'))
    } else {
      if (/^[0-9a-zA-Z_]{5,22}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('5-22位数字、字母、下划线'))
      }
    }
  },
  //新建联系人
  peopleNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('名称不能为空'))
    } else {
      if (/^[0-9a-zA-Z_]{5,22}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('5-22位数字、字母、下划线'))
      }
    }
  },
  mobileValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入手机号码'))
    } else {
      if (
        /^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|16[6]|17[2|3|5|6|7|8]|18[0|1|2|3|5|6|7|8|9]|19[0|1|2|3|5|6|7|8|9])+\d{8}$/.test(
          value
        )
      ) {
        return callback()
      } else {
        return callback(new Error('请输入正确的手机号码'))
      }
    }
  },
  emailValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入邮箱'))
    } else {
      if (value.length > 40) {
        return callback(new Error('邮箱最长40位'))
      } else {
        if (!/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/.test(value)) {
          return callback(new Error('请输入正确的邮箱'))
        } else {
          return callback()
        }
      }
    }
  },
  //账户
  name(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入账户'))
    } else {
      return callback()
    }
  },
  //设置密码
  password(rule, value, callback) {
    callback(passwordVerify(value))
  },
  pwdValidator(rule, value, callback) {
    let count = 0
    if (!value.length) {
      return callback(new Error('请输入密码'))
    } else if (value.length < 6 || value.length > 20) {
      return callback(new Error('密码长度在6~20之间'))
    } else if (
      /^[a-z]+$/.test(value) ||
      /^[A-Z]+$/.test(value) ||
      /^[0-9]+$/.test(value) ||
      /^[` ~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~！@#￥%……&*（）——\-+={}|《》？：“”【】、；‘’，。、]+$/.test(
        value
      )
    ) {
      return callback(new Error('密码必须包含字母、数字、特殊字符中的两种或以上'))
    } else if (/ /.test(value)) {
      return callback(new Error('密码不能输入空格'))
    } else if (/[\u4e00-\u9fa5]/.test(value)) {
      return callback(new Error('密码不能输入中文'))
    } else {
      return callback()
    }
  },
  //登录密码
  loginPassword(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入密码'))
    } else {
      return callback()
    }
  },
  //用户名（中文）
  userNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入用户名'))
    } else {
      if (/^[0-9a-zA-Z_\u4e00-\u9fa5]{1,20}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-20位中文、数字、字母、下划线!'))
      }
    }
  },
  //账户
  userNameEngValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入账户'))
    } else {
      if (/^[0-9a-zA-Z_]{1,20}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-20位字母、数字、下划线!'))
      }
    }
  },
  //权限名称
  privilegeNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入权限名称'))
    } else {
      if (/^[0-9a-zA-Z_\u4e00-\u9fa5]{1,20}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-20位中文、字母、数字、下划线!'))
      }
    }
  },
  //权限描述信息
  detailsValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入权限描述'))
    } else {
      if (value.length > 60) {
        return callback(new Error('权限描述限定60个字符数以内!'))
      } else {
        if (/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(value) || isEmpty(value)) {
          return callback()
        } else {
          return callback(new Error('描述只能为数字、字母、下划线、中文'))
        }
      }
    }
  },
  //规则描述信息
  infoValidator(rule, value, callback) {
    if (!value) {
      return callback()
    } else {
      if (value.length > 60) {
        return callback(new Error('规则描述限定60个字符数以内!'))
      } else {
        return callback()
      }
    }
  },
  //规则名称
  ruleNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入规则名称'))
    } else {
      if (/^[0-9a-zA-Z_\u4e00-\u9fa5]{1,20}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-20位中文、数字、字母、下划线!'))
      }
    }
  },
  //窗口时间设置
  windowsTimeValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入5-60之间的整数！'))
    } else {
      if (!/^\d+$/.test(value)) {
        return callback(new Error('请输入5-60之间的整数！'))
      } else if (Number(value) > 60 || Number(value) < 5) {
        return callback(new Error('请输入5-60之间的整数！'))
      } else {
        return callback()
      }
    }
  },
  //设备名称
  deviceNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入设备名称'))
    } else {
      if (/^[0-9a-zA-Z_\u4e00-\u9fa5]{1,50}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-50位中文、数字、字母、下划线!'))
      }
    }
  },
  //厂商名称
  supplierNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入厂商'))
    } else {
      if (/^[0-9a-zA-Z_\u4e00-\u9fa5]{1,50}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-50位中文、数字、字母、下划线!'))
      }
    }
  },
  optionalValidator(rule, value, callback) {
    if (!value) {
      return callback()
    } else {
      if (value.length <= 50) {
        return callback()
      } else {
        return callback(new Error('1-50位字符!'))
      }
    }
  },
  //字段名称
  fieldNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入字段名称'))
    } else {
      if (/^[a-zA-Z_]{1,20}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-20位字母、下划线!'))
      }
    }
  },
  //字段说明
  fieldDetailValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入字段说明'))
    } else {
      if (value.length <= 20) {
        return callback()
      } else {
        return callback(new Error('1-20位字符!'))
      }
    }
  },
  //设备类型描述信息
  deviceTypeDetailValidator(rule, value, callback) {
    if (!value) {
      return callback()
    } else {
      if (value.length > 200) {
        return callback(new Error('设备类型描述限定200个字符数以内!'))
      } else {
        return callback()
      }
    }
  },
  //编码
  encodingValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入编码'))
    } else {
      if (/^[0-9a-zA-Z_]{1,10}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-10位字母、数字、下划线!'))
      }
    }
  },
  //设备类型名称
  devTypeNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入名称'))
    } else {
      if (value.length <= 50) {
        return callback()
      } else {
        return callback(new Error('1-50位字符!'))
      }
    }
  },
  //日志类型名称
  logTypeNameValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入日志类型名称'))
    } else {
      if (/^[0-9a-zA-Z_\u4e00-\u9fa5]{1,20}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-20位中文、数字、字母、下划线!'))
      }
    }
  },
  //日志类型编码
  logTypeCodeValidator(rule, value, callback) {
    if (!value) {
      return callback(new Error('请输入日志类型编码'))
    } else {
      if (/^[0-9a-zA-Z_]{1,30}$/.test(value)) {
        return callback()
      } else {
        return callback(new Error('1-30位数字、字母、下划线!'))
      }
    }
  },
  //区域参数
  areaPraValidator(rule, value, callback) {
    if (!value) {
      return callback()
      //return callback(new Error('请输入区域参数'))
    } else {
      let val = value.split(',')
      if (val.length > 5) {
        return callback(new Error('区域参数不能超过五个！'))
      } else {
        if (!checkDuplicationNormal(val)) {
          return callback()
        } else {
          return callback(new Error('区域参数相互不能重复！'))
        }
      }
    }
  }
}
